#include <bits/stdc++.h>
#define int long long 
using namespace std;

const int maxn = 1e5 + 10;
int fa[maxn][25]; // 父亲节点
int cnt[maxn][25]; // 记录这条路径上的 零食的种类数目
int dep[maxn]; // 每个节点的深度
int n, q;
vector<int> adj[maxn];
int c[maxn]; // 直接表示这个节点对应的零食种类

void dfs(int u, int p){
	fa[u][0]=p; // 记录直接父亲节点
//	cout<<u<<' '<<0<<' '<<fa[u][0]<<'\n';
	cnt[u][0]=c[u]|c[p];
	dep[u]=dep[p]+1; // 深度
	for(auto nex: adj[u]){
		if(nex==p){
			continue;
		}
		dfs(nex, u);
	}
}

int lca(int x, int y){
	int res=c[x]|c[y];
	if(dep[x]<dep[y]){
		swap(x, y); // 保证 x 是那个深的
	}
	// 开始往上跳
	for(int j=20;j>=0;j--){
		if(dep[fa[x][j]]>=dep[y]){
			res|=cnt[x][j]; // 先加上去再 |
			x=fa[x][j];
		}
	}
	// 跳到同一深度
	if(x==y){
		return res;
	}
	
	// 不是同一节点, 继续往上跳
	for(int j=20;j>=0;j--){
		if(fa[x][j]!=fa[y][j]){
			// 先加上去再 修改位置
			res|=cnt[x][j];
			res|=cnt[y][j];
			x=fa[x][j];
			y=fa[y][j];
		}
	}
	res|=c[fa[x][0]];
	return res;
}

int get_cnt(int x){
	int res=0;
	while(x){
		res++;
		x=x&(x-1);
	}
	return res;
}

void solve(){
	cin>>n>>q;
	
	for(int i=1;i<=n;i++){
		int tmp;
		cin>>tmp;
		c[i]=(1<<(tmp-1));
	}
	
	for(int i=1;i<=n-1;i++){
		int u, v;
		cin>>u>>v;
		adj[u].push_back(v);
		adj[v].push_back(u);
	}
	
	dfs(1, 0);
	
	// 倍增
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			fa[i][j]=fa[fa[i][j-1]][j-1];
			cnt[i][j]=cnt[i][j-1]|(cnt[fa[i][j-1]][j-1]);
//			cout<<i<<' '<<j<<' '<<cnt[i][j]<<'\n';
		}
	}
	
	for(int i=1;i<=q;i++){
		int s,t;
		cin>>s>>t;
		cout<<get_cnt(lca(s, t))<<'\n';
	}
	
}

signed main(){
	ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
	solve();
	return 0;
}



